문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 캐시 메모리 (문단 편집) ===== 캐시 배치 정책 (Cache Placement Policy) ===== 흔히 캐시 사상(Mapping) 구조라고도 부르는 정책으로, 여러 캐시 엔트리들을 배치하는 방법을 설명하는 정책이기도 하다. * '''{{{+4 Direct Mapped Cache}}}''' {{{#!wiki style="word-break: keep-all" | 캐시 라인 n개 |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|5> ||<|5>,,캐시 라인 수 : [math(n)]개[br]캐시 블록 수 : [math(n)]개[br]캐시 블록 용량 : [math(a)] Byte[br]캐시 메모리 용량 : [math(b \times 2^{c} = 2^{\log_2 b} \times 2^{c} = 2^{{(\log_2 b)}+{c}} = n×a)] Byte[br]메인 메모리 용량 : [math(d \times 2^{e} = 2^{\log_2 d} \times 2^{e} = 2^{{(\log_2 d)}+{e}})] Byte[br]메인 메모리 블록 수 : [math(2^{{(\log_2 d)}+{e}-{a}})]개[br]메인 메모리 주소 비트 : [math(\lceil(\log_2 d)\rceil +e)] bit[br]인덱스 필드 : [math(\lceil(\log_2 n)\rceil)] bit[br]블록 오프셋 필드 : [math(\lceil(\log_2 a)\rceil)] bit[br]태그 필드 : [math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 n)\rceil - \lceil(\log_2 a)\rceil)] bit,, || ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} || ||<|1><-2> [math(\vdots)] || ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} || ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || ||<-4> || ||<|1><-4> {{{#!wiki style="margin: -6px -1px -11px" | 메인 메모리 주소 비트 | 태그 필드[br],,[math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 n)\rceil - \lceil(\log_2 a)\rceil)] bit,, || 인덱스 필드[br],,[math(\lceil(\log_2 n)\rceil)] bit,, || 블록 오프셋 필드[br],,[math(\lceil(\log_2 a)\rceil)] bit,, || }}} || }}} [[파일:external/www.cs.fsu.edu/F7.5.gif]] 가장 기본적인 캐시 배치 정책으로, 직역해서 '직접 사상(寫像) 방식'이라고도 한다. [[DRAM]]의 여러 주소가 캐시 메모리의 한 주소에 대응되는 다대일(n:1) 방식이다. 그림을 참고해서 간단히 설명하자면, 메인 메모리의 공간이 32개(00000₂부터 11111₂)이고, 캐시 메모리의 공간이 8개(000₂부터 111₂)이면, 메인 메모리의 주소가 00000₂, 01000₂, 10000₂, 11000₂인 곳의 데이터를 캐시 메모리의 주소가 000₂인 곳에만 읽고 쓰는 방식이다. 이때 000₂을 인덱스 필드(Index Field), 인덱스를 제외한 나머지 비트 00₂, 01₂, 10₂, 11₂을 태그 필드(Tag Field)라 하고, 기본적으로 태그 비트와 인덱스 비트 뒤에 데이터를 저장하는 데이터 필드(Data Field)가[* 블록 오프셋 필드(Offset Field)라고도 부른다.] 붙어있는 구조를 갖고 있다. Direct Mapped Cache의 작동 방식은 대략 다음과 같은 식이다. 캐시 메모리가 비워진 상태로 CPU가 [[DRAM|메인 메모리]]의 00000₂ 주소의 데이터를 두 번 연속해서 읽는다고 하자. CPU는 먼저 캐시 메모리를 뒤적이는데 요청한 주소가 00000₂이므로 캐시 메모리의 주소가 000₂인 곳을 확인한다. 확인 후 아무것도 없는 것을 확인하고 직접 메인 메모리의 00000₂주소를 참조하여 데이터를 읽어온다. 이때 --또 쓸지도 모르니까-- 캐시 메모리의 000₂인 공간에 00₂ 태그 비트와 아까 읽은 메인 메모리 00000₂의 데이터를 저장해 놓는다. 그 다음 바로 같은 동작을 수행하면서 똑같이 캐시 메모리의 000₂ 인 곳을 확인하는데 이번엔 데이터가 들어있으니 그 데이터가 CPU가 요구한 주소의 데이터와 일치하는지 태그 비트를 비교하는 검사를 한 뒤 태그 비트마저 일치하면 캐시 메모리에서 데이터를 가져온다. 간단하고 빠르지만 대신 약점이 굉장히 큰데, conflict miss 문제가 굉장히 큰 방식이다. 직관적으로 생각해서 위 그림의 회색 데이터는 하나도 저장할 필요가 없는데 주황색 데이터 중 2개 이상을 동시에 저장해야 하는 일이 생기면 굉장히 골치 아플 것임을 알 수 있다. 캐시 메모리의 공간 활용도가 떨어지는 셈이다. conflict miss가 심한 문제점 때문에 현대 CPU에서는 어지간하면 채택되지 않는 편이다. * '''{{{+4 Fully Associative Cache}}}''' {{{#!wiki style="word-break: keep-all" | 캐시 라인 n개 |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> [math(\cdots)] ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || ||<-10> || ||<-10>,,캐시 라인 수 : [math(n)]개[br]캐시 블록 수 : [math(n)]개[br]캐시 블록 용량 : [math(a)] Byte[br]캐시 메모리 용량 : [math(b \times 2^{c} = 2^{\log_2 b} \times 2^{c} = 2^{{(\log_2 b)}+{c}} = n×a)] Byte[br]메인 메모리 용량 : [math(d \times 2^{e} = 2^{\log_2 d} \times 2^{e} = 2^{{(\log_2 d)}+{e}})] Byte[br]메인 메모리 블록 수 : [math(2^{{(\log_2 d)}+{e}-{a}})]개[br]메인 메모리 주소 비트 : [math(\lceil(\log_2 d)\rceil +e)] bit[br]인덱스 필드 : (필요 없음)[br]블록 오프셋 필드 : [math(\lceil(\log_2 a)\rceil)] bit[br]태그 필드 : [math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 a)\rceil)] bit,, || ||<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 메인 메모리 주소 비트 | 태그 필드[br],,[math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 a)\rceil)] bit,, || 블록 오프셋 필드[br],,[math(\lceil(\log_2 a)\rceil)] bit,, || }}} || }}} 완전 연관 사상 방식이라고도 부르며, 쉽게 설명하면 비어있는 캐시 메모리가 있으면 그냥 마음대로 주소를 저장하는 방식이다. 즉 저장할 때는 크게 알고리즘이 필요 없어서 간단하면서도 캐시 메모리 공간 활용도가 높지만, 찾을 때가 문제다. 어떠한 조건이나 규칙이 없으니 '''모든 캐시 블록에서 원하는 데이터가 있는지 일일이 찾아서 검사해야 한다.''' 이를 위해 CAM(Content Addressable Memory)라는[* 주로 네트워크 분야에서 라우팅 테이블이나 [[MAC]] 테이블의 작업 성능을 향상 시킬 목적으로 사용되는 편이다.] 특수한 형태의 메모리 구조를 사용하게 되는데, 가격이 비싼 점이 흠이다. 비용 문제가 커서 이용하는 곳이 없을 것 같지만, CPU 내부 여러 계층의 [[TLB]](Translation Lookaside Buffer)들 중 L1 명령어 TLB가 이 방식에 채택되는 편이다. * '''{{{+4 Set Associative Cache}}}''' {{{#!wiki style="word-break: keep-all" | 캐시 세트 m개 × 캐시 세트당 캐시 라인 n개 |<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 세트 0 |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> [math(\cdots)] ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || }}} || ||<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 세트 1 |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> [math(\cdots)] ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || }}} || ||<|1><-10> [math(\vdots)] || ||<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 세트 (m-1) |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> [math(\cdots)] ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || }}} || ||<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 세트 m |<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 0 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 1 | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> [math(\cdots)] ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 (n-1) | 캐시 태그 || 캐시 블록 || }}} ||<|1><-2> {{{#!wiki style="margin: -6px -1px -11px" | 캐시 엔트리 n | 캐시 태그 || 캐시 블록 || }}} || }}} || ||<-10> || ||<-10>,,캐시 세트 수 : [math(m)]개[br]캐시 세트당 캐시 라인 수 : [math(n)]개[br]캐시 블록 수 : [math((m×n))]개[br]캐시 블록 용량 : [math(a)] Byte[br]캐시 메모리 용량 : [math(b \times 2^{c} = 2^{\log_2 b} \times 2^{c} = 2^{{(\log_2 b)}+{c}} = n×m×a)] Byte[br]메인 메모리 용량 : [math(d \times 2^{e} = 2^{\log_2 d} \times 2^{e} = 2^{{(\log_2 d)}+{e}})] Byte[br]메인 메모리 블록 수 : [math(2^{{(\log_2 d)}+{e}-{a}})]개[br]메인 메모리 주소 비트 : [math(\lceil(\log_2 d)\rceil +e)] bit[br]세트 인덱스 필드 : [math(\lceil(\log_2 m)\rceil)] bit[br]블록 오프셋 필드 : [math(\lceil(\log_2 a)\rceil)] bit[br]태그 필드 : [math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 m)\rceil - \lceil(\log_2 a)\rceil)] bit,, || ||<|1><-10> {{{#!wiki style="margin: -6px -1px -11px" | 메인 메모리 주소 비트 | 태그 필드[br],,[math(\lceil(\log_2 d)\rceil + e - \lceil(\log_2 m)\rceil - \lceil(\log_2 a)\rceil)] bit,, || 세트 인덱스 필드[br],,[math(\lceil(\log_2 m)\rceil)] bit,, || 블록 오프셋 필드[br],,[math(\lceil(\log_2 a)\rceil)] bit,, || }}} || }}} 집합 연관 사상 방식이라고도 부르며, Direct Mapped Cache의 장점과 Fully Associative Cache의 장점을 섞었다고 할 수 있는 가장 나중에 나온 방식이다. 특정 행을 지정해서 그 행 안의 어떤 열이든 비어있으면 저장하는 방식이다. 당연히 Direct에 비해서는 검색은 오래 걸리지만 저장이 빠르며, Associative에 비해 저장이 느린 대신 검색이 빠른 중간적인 특징이라고 할 수 있다. 현대 CPU 모든 계층의 캐시 메모리에서 채택되는 방식이며, [[CPU-Z]]의 계층별 캐시 메모리 용량 정보 옆에 표기된 n-way가 이 방식을 의미한다. 단, 표기해야 할 캐시 메모리 용량 정보가 많은 CPU일 경우, n-way 항목이 생략된다. CPU-Z VALIDATOR 사이트를 통해 확인할 수 있다. 참고로, 두 방식을 혼합한 방식이기 때문에 Direct Mapped Cache는 1-way Set Associative Cache, Fully Associative Cache는 (전체 캐시 라인 수)-way Set Associative Cache로도 표현할 수 있다. * '''{{{+5 예시) 인텔 코어 i9-9900K + DDR4 SDRAM 128 GB인 메인 메모리}}}''' * L3 캐시 메모리 데이터 가용량 : 16 MB (= 2^^24^^ Byte) * L3 캐시 블록 용량 : 64 Byte (= 2^^6^^ Byte) * L3 캐시 배치 정책 : 16-way Set Associative * L3 캐시 세트당 캐시 라인의 수 : 16개 (= 2^^4^^개) * L3 캐시 블록의 수 : 262,144개 (= 2^^18^^개) * L3 캐시 세트의 수 : 16,384개 (= 2^^14^^개) * 메인 메모리 주소 비트 : 37-bit ([math(\because)] 128 GB = 2^^37^^ Byte) * L3 캐시 블록 오프셋 비트 : 6-bit ([math(\because)] 64 = 2^^6^^) * L3 캐시 세트 인덱스 비트 : 14-bit ([math(\because)] 16,384 = 2^^14^^) * L3 캐시 태그 비트 : 17-bit ([math(\because)] 37 - (6 + 14) = 17) * L3 캐시 메모리 오버헤드 : 3.3203125% * L3 캐시 메모리 실제 용량 : 16.53125 MB저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기